# -*- coding:utf-8 -*-

# 上传用户头像
import logging
from flask import g
from flask import request
from flask import jsonify
from flask import session
from ihome.api_1_0 import api
from ihome.utils.response_code import RET
from ihome.utils.common import login_required
from ihome.utils import constants
from ihome.libs.image_storage import storage
from ihome import db
from ihome.models import User


@api.route('/users/avatar', methods=['POST'])
@login_required
def set_user_avatar():
    # 图片以表单提交的
    # 一 获取参数
    # 获取用户的id
    user_id = g.user_id

    # 获取用户头像
    image_file = request.files.get('avatar')

    # 二 校验参数
    if image_file is None:
        return jsonify(errno=RET.DATAERR, errmsg='上传图片为空', userInfo='上传图片失败')

    # 三 逻辑处理
    # 1 调用工具类上传头像
    # 读取上传的文件对象内容
    image_data = image_file.read()

    try:
        avatar_name = storage(image_data)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='图片上传失败', userInfo='图片上传失败')

    # 2 保存文件名到数据库中
    try:
        User.query.filter_by(id=user_id).update({'avatar_url': avatar_name})
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='mysql数据跟新失败', userInfo='网络连接错误,请重试')

    # 四 返回结果
    avatar_url = constants.QINIU_URL_DOMAIN + avatar_name
    return jsonify(errno=RET.OK, errmsg='头像上传成功', data={'avatar_url': avatar_url})


# 修改用户名
@api.route('/users/name', methods=['PUT'])
@login_required
def change_user_name():
    """修改用户名"""
    # 一 获取参数
    # 使用了 login_required 装饰器后,可以从g对象中获取用户user_id
    user_id = g.user_id

    # 获取用户想要设置的用户名
    req_json = request.get_json()

    # 二 校验参数
    if req_json is None:
        return jsonify(errno=RET.PARAMERR, error='参数不完整', userInfo='请确保参数完整')

    new_name = req_json.get('name')
    if new_name is None:
        return jsonify(errno=RET.PARAMERR, error='昵称为空', userInfo='昵称不能为空')

    # 三 逻辑处理
    # 保存用户昵称name, 并同时判断那么是否重复(利用数据的唯一索引)
    try:
        User.query.filter_by(id=user_id).update({'name': new_name})
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='mysql更新失败', userInfo='网络连接失败,请重试')

    # 修改session数据中的name字段
    session['user_name'] = new_name
    print 'session:', session

    # 四 返回结果
    return jsonify(errno=RET.OK, errmsg='昵称修改成功', userInfo='昵称修改成功', data={"name": new_name})


# 获取用户个人信息接口
@api.route('/users', methods=['GET'])
@login_required
def get_user_profile():
    """获取个人信息接口"""
    # 一 获取参数
    # 获取用户id
    user_id = g.user_id
    # 获取用户
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='Mysql查询失败', userInfo='网络连接失败,请重试')

    # 二 校验参数
    if user is None:
        return jsonify(errno=RET.NODATA, errmsg='Mysql未查询数据', userInfo='网络连接失败,请重试')

    # 三 逻辑处理 获取用户相关字段数据
    user_dict = user.to_dict()

    # 四 返回结果
    return jsonify(errno=RET.OK, errmsg='成功获取用户数据', userInfo='操作成功', data=user_dict)


# 增加实名认证接口
@api.route('/users/auth', methods=['POST'])
@login_required
def set_user_auth():
    """保存实名认证信息"""
    # 一 获取参数
    # 用户id
    user_id = g.user_id

    # 提交参数
    req_json = request.get_json()
    if req_json is None:
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整', userInfo='提交信息不完整,请重试')

    real_name = req_json.get('real_name')  # 真实姓名
    id_card = req_json.get('id_card')  # 身份证号

    # 二 校验参数
    if not all([real_name, id_card]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整', userInfo='提交信息不完整,请重试')

    # 三 逻辑处理
    # 保存用户真实姓名和身份证到数据库中
    try:
        User.query.filter_by(id=user_id, real_name=None, id_card=None).update(
            {"id_card": id_card, "real_name": real_name})
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库更新失败,实名认证失败', userInfo='网络连接失败,请重试')

    # 四 返回结果
    return jsonify(errno=RET.OK, errmsg='实名认证成功', userInfo='实名认证成功')


# 查询实名认证信息
@api.route('/users/auth', methods=['GET'])
@login_required
def get_user_auth():
    """获取用户的实名认证信息"""
    user_id = g.user_id

    # 在数据库中查询信息
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='msyql查询用户失败', userInfo='查询失败,请确定您输入的信息是正确的')

    if user is None:
        return jsonify(errno=RET.NODATA, errmsg="为查找到有效用户", userInfo='操作的用户不存在')

    auth_dict = user.auth_to_dict()

    return jsonify(errno=RET.OK, errmsg='查询成功', data=auth_dict)
